﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Iudicium.Persona.CRN
{

    /// <summary>
    /// Descripción breve de AdministrativoCRn
    /// </summary>
    public class AdministrativoCRN
    {
        public AdministrativoCRN()
        {
            
        }

        public static bool InsertAdministrativo(Administrativo objAdministrativo)
        {
            if (objAdministrativo == null)
            {
                throw new ArgumentException("objAdministrativo no puede ser nulo.");
            }

            if (objAdministrativo.AdministrativoId <= 0)
            {
                throw new ArgumentException("AdministrativoId no puede ser menor o igual que cero.");
            }

            if (objAdministrativo.FechaIngreso == null || objAdministrativo.FechaIngreso.Equals(DateTime.MinValue))
            {
                throw new ArgumentException("FechaIngreso debe ser una fecha valida");
            }

            if (objAdministrativo.CargoId <= 0)
            {
                throw new ArgumentException("CargoId no puede ser menor o igual que 0");
            }
            bool? insertado = false;

            AdministrativoDSTableAdapters.AdministrativoTableAdapter adapter =
                new AdministrativoDSTableAdapters.AdministrativoTableAdapter();

            adapter.Insert(ref insertado, objAdministrativo.AdministrativoId, 
                objAdministrativo.FechaIngreso, objAdministrativo.CargoId);

            if (insertado == null)
            {
                throw new Exception("El SQL se ejecuto con exito, pero no se obtuvo los resultados esperados");
            }

            return insertado.Value;
        }

        public static void UpdateAdministrativo(Administrativo objAdministrativo)
        {
            if (objAdministrativo == null)
            {
                throw new ArgumentException("objAdministrativo no puede ser nulo.");
            }

            if (objAdministrativo.AdministrativoId <= 0)
            {
                throw new ArgumentException("AdministrativoId no puede ser menor o igual que cero.");
            }

            if (objAdministrativo.FechaIngreso == null || objAdministrativo.FechaIngreso.Equals(DateTime.MinValue))
            {
                throw new ArgumentException("FechaIngreso debe ser una fecha valida");
            }

            if (objAdministrativo.CargoId <= 0)
            {
                throw new ArgumentException("CargoId no puede ser menor o igual que 0");
            }

            AdministrativoDSTableAdapters.AdministrativoTableAdapter adapter =
                new AdministrativoDSTableAdapters.AdministrativoTableAdapter();

            adapter.Update(objAdministrativo.AdministrativoId,
                objAdministrativo.FechaIngreso, objAdministrativo.CargoId);

        }

        public static void DeleteAdministrativo(int administrativoId)
        {
            if (administrativoId <= 0)
            {
                throw new ArgumentException("AdministrativoId no puede ser menor o igual que cero.");
            }

            AdministrativoDSTableAdapters.AdministrativoTableAdapter adapter =
                new AdministrativoDSTableAdapters.AdministrativoTableAdapter();

            adapter.Delete(administrativoId);
        }

        public static Administrativo GetAdministrativoById(int administrativoId)
        {
            if (administrativoId <= 0)
            {
                throw new ArgumentException("AdministrativoId no puede ser menor o igual que cero.");
            }

            AdministrativoDSTableAdapters.AdministrativoTableAdapter adapter =
                new AdministrativoDSTableAdapters.AdministrativoTableAdapter();

            AdministrativoDS.AdministrativoDataTable tabla = adapter.GetAdministrativoById(administrativoId);

            if (tabla == null || tabla.Count <= 0 || tabla[0].administrativoId <= 0)
            {
                throw new Exception("El SQL se ejecuto con exito, pero no se obtuvo los resultados esperados");
            }

            Administrativo objAdministrativo = ConstruirAdministrativo(tabla[0]);
            return objAdministrativo;
        }

        public static List<Administrativo> GetAdministrativosBySearch(string parametro)
        {
            AdministrativoDSTableAdapters.AdministrativoTableAdapter adapter =
                new AdministrativoDSTableAdapters.AdministrativoTableAdapter();

            AdministrativoDS.AdministrativoDataTable tabla = adapter.GetAdministrativoBySearch(parametro);

            if (tabla == null)
            {
                throw new Exception("El SQL se ejecuto con exito, pero no se obtuvo los resultados esperados");
            }
            List<Administrativo> lista = new List<Administrativo>();

            foreach (AdministrativoDS.AdministrativoRow row in tabla)
            {
                Administrativo objAdministrativo = ConstruirAdministrativo(row);
                lista.Add(objAdministrativo);
            }
            return lista;
        }

        public static List<PersonaResultadoSimple> SearchAdministrativosForResponsables(string searchTerm, string ids)
        {
            if (string.IsNullOrEmpty(searchTerm))
            {
                throw new ArgumentException("El termino de busque no puede ser nulo o vacio");
            }

            PersonaDSTableAdapters.PersonasForInvolucradosTableAdapter adpater = new PersonaDSTableAdapters.PersonasForInvolucradosTableAdapter();

            PersonaDS.PersonasForInvolucradosDataTable tabla = adpater.SearchAdministrativosForResponsables(searchTerm, ids);

            if (tabla == null)
            {
                throw new Exception("El SQL se ejecuto correctamente pero devolvio un conjunto de datos nulo");
            }
            List<PersonaResultadoSimple> lista = new List<PersonaResultadoSimple>();

            foreach (PersonaDS.PersonasForInvolucradosRow row in tabla)
            {
                if (row.personaId == 1)
                    continue;
                PersonaResultadoSimple obj = new PersonaResultadoSimple(row.personaId, row.nombre);
                lista.Add(obj);
            }
            return lista;
        }

        private static Administrativo ConstruirAdministrativo(AdministrativoDS.AdministrativoRow row)
        {
            return new Administrativo(row.administrativoId, row.fechaIngreso, row.cargoId, row.nombre, row.nombreCargo);
        }
    }
}
